package com.example.d8_thread_pool;

import java.util.concurrent.*;

/**
 * 目标：线程池的创建 - Executors工具类创建线程池对象
 */
public class ThreadPoolTest3 {
    public static void main(String[] args) throws Exception {
        // Executors是一个线程池的工具类,提供了很多静态方法,用于返回不同特点的线程池对象
        /*
        public static ExecutorService newFixedThreadPool (int nThreads)	创建固定线程数量的线程池,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程替代它
        public static ExecutorService newSingleThreadExecutor()	创建只有一个线程的线程池对象,如果该线程出现异常而结束,那么线程池会补充一个新线程
        public static ExecutorService newCachedThreadPool()	线程数量随着任务增加而增加,如果线程任务执行完毕且空闲了60s则会被回收掉
        public static ScheduledExecutorService newScheduledThreadPool (int corePoolSize) 创建一个线程池,可以实现在给定的延迟后运行任务,或者定期执行任务
         */
        // 注意:这些方法底层都是通过线程池的实现类ThreadPoolExecutor创建的线程池对象

        // 1.通过Executors创建一个线程池对象
        ExecutorService pool = Executors.newFixedThreadPool(3);
        // 核心线程数量到底配置多少呢
        // 计算密集型的任务：核心线程数量 = CPU的核数 + 1
        // IO密集型的任务：核心线程数量 = CPU核数 * 2

        Future<String> f1 = pool.submit(new MyCallable(100));
        Future<String> f2 = pool.submit(new MyCallable(200));
        Future<String> f3 = pool.submit(new MyCallable(300));
        Future<String> f4 = pool.submit(new MyCallable(400));

        System.out.println(f1.get());
        System.out.println(f2.get());
        System.out.println(f3.get());
        System.out.println(f4.get());
    }
}
